﻿#pragma once

#include "Const.h"
#include "Man.h"

// 游戏
class Game {
    // 移动结点
    class MoveNode {
        private: BaseGameObject* box;   // 被推动的箱子
        private: UINT direction;        // 移动方向

        /**
         * 构造方法。
         * @param box       被推动的箱子
         * @param direction 移动方向
         */
        public: MoveNode(BaseGameObject* box, UINT direction): 
            box(box), 
            direction(direction) {
        }

        /**
         * 获取箱子。
         * @return 箱子
         */
        public: BaseGameObject* GetBox() {
            return box;
        }

        /**
         * 获取方向。
         * @return 方向
         */
        public: UINT GetDirection() {
            return direction;
        }
    };
 
    // 状态
    private: enum Status {
        END,    // 已结束
        PLAYING // 游戏中
    };

    typedef CList<MoveNode*, MoveNode*> MoveList;

    private: int mBoxCount;         // 未到达目的地的箱子数
    private: CWnd* mCallback;       // 回调
    private: CDC* mDrawer;          // 绘图者
    private: CWnd* mGameBoard;      // 游戏区域
    private: int mLevel;            // 关卡数
    private: Man* mMan;             // 小人
    private: int mMoveCount;        // 移动次数
    private: MoveList mMoveList;    // 所有移动结点
    private: Status mStatus;        // 状态
    public: static BaseGameObject* sBaseGameObjects[Const::GAME_BOARD_GRID_COUNT_V][Const::GAME_BOARD_GRID_COUNT_H]; // 所有游戏物体

    public: Game(CWnd*, CDC*, CWnd*);
    public: ~Game();
    private: void Clear();
    private: void EnterLevel();
    private: void GameOver(BOOL);
    public: int GetLevel();
    public: void GotoLevel(int);
    private: void GotoNextLevel();
    private: BOOL IsWon();
    public: BOOL OnKeyPressed(UINT);
    public: void Restart();
    public: void Undo();
};
